package com.crowntit.infrastructure.adapter.repository;

import com.crowntit.infrastructure.DCCService;
import com.crowntit.infrastructure.redis.IRedisService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import java.util.function.Supplier;

@Slf4j
public abstract class AbstractRepository {
    private final Logger logger = LoggerFactory.getLogger(AbstractRepository.class);

    @Resource
    private DCCService dccService;

    @Resource
    private IRedisService redisService;

    protected <T> T getFromCacheOrDb(String cacheKey, Supplier<T> supplier){
        // 判断是否开启缓存
        if (dccService.isCacheOpenSwitch()) {
            log.info("进入缓存降级查询");
            // 查询缓存
            T cacheResult = redisService.getValue(cacheKey);

            // 缓存中数据存在
            if (cacheResult != null){
                return cacheResult;
            }

            // 缓存中无数据，查询数据库
            T dbResult = supplier.get();
            // 数据库无数据，直接返回
            if (dbResult == null){
                return null;
            }

            // 数据库有数据，写入缓存
            redisService.setValue(cacheKey, dbResult);
            return dbResult;
        } else {
            // 未开启缓存查询，直接查数据库
            logger.warn("缓存降级 {}", cacheKey);
            return supplier.get();
        }
    }

    /**
     * 带过期时间版本的数据获取方法
     * @param cacheKey
     * @param supplier
     * @return
     * @param <T>
     */
    protected <T> T getFromCacheOrDb(String cacheKey, Supplier<T> supplier, long expired){
        // 判断是否开启缓存
        if (dccService.isCacheOpenSwitch()) {
            // 查询缓存
            T cacheResult = redisService.getValue(cacheKey);

            // 缓存中数据存在
            if (cacheResult != null){
                return cacheResult;
            }

            // 缓存中无数据，查询数据库
            T dbResult = supplier.get();
            // 数据库无数据，直接返回
            if (dbResult == null){
                return null;
            }

            // 数据库有数据，写入缓存
            redisService.setValue(cacheKey, dbResult, expired);
            return dbResult;
        } else {
            // 未开启缓存查询，直接查数据库
            logger.warn("缓存降级 {}", cacheKey);
            return supplier.get();
        }
    }

}
